/**
 * 配置服务
 * @author liu_jshan
 * @date 20241015
 */
import { get, post, _delete } from "../../utils/requestUtil";
import { createCacher } from '../cache/cacheService'

//创建缓存器
const cacher = createCacher('formSchema', _getTemplateByCode)

/**
 * 根据代码异步获取模板信息
 * 此函数通过发送HTTP GET请求来获取模板数据，并对获取到的内容进行解析
 * @param {string} code - 模板的唯一代码标识符
 * @returns {Promise<Object|null>} - 返回解析后的模板对象，如果请求失败或数据无效则返回null
 */
async function _getTemplateByCode(code) {
    // 发起GET请求以获取模板数据
    const response = await get(`/schema/get/code?code=${code}`)

    // 检查响应是否存在且状态码为200
    if (response && response.code === 200) {
        // 解析响应内容中的content字段，并将其赋值回原对象
        response.data.content = JSON.parse(response.data.content)

        // 返回解析后的模板数据
        return response.data
    } else {
        // 如果响应无效或状态码非200，则返回null
        return null
    }
}

/**
 * 根据标识异步获取模板
 * 此函数使用缓存来存储和获取模板，以标识作为键
 * 使用异步函数确保操作不会阻塞主线程，特别是在处理I/O操作时
 * 
 * @param {string} code - 模板的唯一标识
 * @returns {Promise} - 返回一个Promise对象，解析为模板
 */
export async function getTemplateByCode(code) {
    return await cacher.get(code)
}

/**
 * 异步函数：保存架构
 * 
 * 该函数通过POST请求将架构信息保存到服务器
 * 它主要用于持久化架构数据，以便在不同时间和地点进行访问和使用
 * 
 * @param {Object} schema - 需要保存的架构对象，包含架构的所有必要信息
 * @returns {Promise<boolean>} - 返回一个Promise，表示架构保存操作的成功与否
 *                               如果服务器返回成功响应（状态码200），则解析为true；
 *                               否则，解析为false
 */
export async function saveSchema(schema) {
    // 发起POST请求，将架构对象作为参数传递给服务器
    const response = await post('/schema/save', {
        body: JSON.stringify(schema)
    })

    // 根据服务器响应判断架构是否成功保存
    if (response && response.code === 200) {
        // 如果响应状态码为200，表示保存成功，返回true
        return true
    } else {
        // 如果响应状态码不是200，表示保存失败，返回false
        return false
    }
}

/**
 * 异步函数：删除指定的schema
 * 
 * 本函数通过发送HTTP DELETE请求来删除指定ID的schema
 * 它主要用于与后端服务交互，以实现schema的删除功能
 * 
 * @param {string} schemaId - 待删除schema的唯一标识符
 * @returns {Promise<boolean>} - 返回一个Promise，表示删除操作的结果
 * 如果响应存在且响应码为200，则表示删除成功，返回true；否则返回false
 */
export async function deleteSchema(schemaId) {
    // 发送HTTP DELETE请求，尝试删除指定ID的schema
    const response = await _delete(`/schema/delete/${schemaId}`)
    // 检查响应是否存在且响应码为200，以确定删除操作是否成功
    return response && response.code === 200
}